https://github.com/FrinyildV/Entregas_MDS_7202¶pandas. En esta segunda parte se incluye adicionalmente agregaciones, concatenaciones, merge y trabajo con strings.plotly.pandas.plotly para obtener información gráfica del dataset.Nota: El laboratorio deberá ser desarrollado sin el uso indiscriminado de iteradores nativos de python (aka "for", "while"). La idea es que aprendan a exprimir al máximo las funciones optimizadas que nos entrega
pandas, las cuales vale mencionar, son bastante más eficientes que los iteradores nativos sobre DataFrames.
# Libreria Core del lab.
import numpy as np
import pandas as pd
from IPython.display import display
#Libreria para visualizar
# !pip install --upgrade plotly
import plotly.figure_factory as ff
import plotly.express as px
Para este laboratorio deberán continuar el Análisis Exploratorio de datos sobre el conjunto students_grades, el cual contiene una caracterización sobre el rendimiento y otros atributos de cada alumno de la Universidad de la Cachaña .
# Si usted está utilizando Colabolatory le puede ser útil este código para cargar los archivos.
try:
from google.colab import drive
drive.mount("/content/drive")
path = 'Dirección donde tiene los archivos en el Drive'
except:
print('Ignorando conexión drive-colab')
Ignorando conexión drive-colab
Ya finalizado en análisis inicial, ud. y su equipo le entregaron a Don Caguayo (rector de la Universidad de la Cachaña) tanto los resultados del análisis como también la base de datos limpia y lista para ser almacenada. Dada la ingente cantidad de los datos, el equipo de TI de la universidad resolvió separar el dataset en dos bases de datos distintas (lo que según argumentan ellos, permitiría hacer agregaciones de forma más eficiente).
Gracias a la excelente labor de ud. y su equipo en el análisis previo, el rector le solicita continuar el trabajo con una nueva batería de análisis. Por este motivo, la sección de TI les entrega nuevamente los datos. Sin embargo, argumentan que dada una escazes de personal, solo le entregarán dumps (copias) de cada base de datos y su equipo deberá unir las bases de datos. Los datos se encuentran en los siguiente archivos .json: students_grades_1.json y students_grades_2.json.
Por ende, ud. y su equipo deciden que la primera tarea se centrará en cargar estos datos y unirlos.
No se preocupe por la limpieza ni transformar el tipo de datos de las columnas, ni tampoco transformar a notas chilenas, recuerde que anteriormente ya se encargo de este tema.
df_grades_1 = pd.read_json('students_grades_1.json')
df_grades_2 = pd.read_json('students_grades_2.json')
df_grades=pd.concat([df_grades_1,df_grades_2],axis=0).reset_index(drop=True)
# mod tipos numericos
df_grades['math score'] = pd.to_numeric(df_grades['math score'], downcast='float', errors='coerce')
df_grades['reading score'] = pd.to_numeric(df_grades['reading score'], downcast='float', errors='coerce')
df_grades['writing score'] = pd.to_numeric(df_grades['writing score'], downcast='float', errors='coerce')
df_grades
| names | gender | race/ethnicity | parental level of education | lunch | test preparation course | math score | reading score | writing score | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | Rita Courtney | female | group B | some high school | standard | none | 3.22 | 3.76 | 3.76 |
| 1 | Charles Linstrom | male | group A | bachelor's degree | standard | completed | 5.80 | 5.68 | 5.86 |
| 2 | Brian Young | male | group C | some high school | standard | none | 5.38 | 4.96 | 4.78 |
| 3 | Howard Jimenez | male | group E | some high school | standard | completed | 5.86 | 5.50 | 5.56 |
| 4 | Wayne Wilson | male | group B | some high school | standard | completed | 6.64 | 6.16 | 6.22 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 870 | Richard Young | male | group D | high school | standard | none | 5.14 | 5.50 | 5.26 |
| 871 | Wanda Russell | female | group B | high school | free/reduced | completed | 2.38 | 3.64 | 3.16 |
| 872 | Marina Zeigler | female | group C | bachelor's degree | free/reduced | completed | 4.96 | 5.44 | 5.86 |
| 873 | Laurie Carter | female | group B | some high school | standard | completed | 4.24 | 4.66 | 4.72 |
| 874 | Amanda Perez | female | group A | high school | standard | completed | 5.08 | 5.80 | 5.56 |
875 rows × 9 columns
df_grades.describe()
| math score | reading score | writing score | |
|---|---|---|---|
| count | 875.000000 | 875.000000 | 875.000000 |
| mean | 4.973508 | 5.151724 | 5.086855 |
| std | 0.904603 | 0.877756 | 0.910454 |
| min | 1.000000 | 2.020000 | 1.600000 |
| 25% | 4.420000 | 4.540000 | 4.450000 |
| 50% | 4.960000 | 5.200000 | 5.140000 |
| 75% | 5.590000 | 5.740000 | 5.740000 |
| max | 7.000000 | 7.000000 | 7.000000 |
Resultado esperado:
df_grades
| names | gender | race/ethnicity | parental level of education | lunch | test preparation course | math score | reading score | writing score | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | Rita Courtney | female | group B | some high school | standard | none | 3.22 | 3.76 | 3.76 |
| 1 | Charles Linstrom | male | group A | bachelor's degree | standard | completed | 5.80 | 5.68 | 5.86 |
| 2 | Brian Young | male | group C | some high school | standard | none | 5.38 | 4.96 | 4.78 |
| 3 | Howard Jimenez | male | group E | some high school | standard | completed | 5.86 | 5.50 | 5.56 |
| 4 | Wayne Wilson | male | group B | some high school | standard | completed | 6.64 | 6.16 | 6.22 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 870 | Richard Young | male | group D | high school | standard | none | 5.14 | 5.50 | 5.26 |
| 871 | Wanda Russell | female | group B | high school | free/reduced | completed | 2.38 | 3.64 | 3.16 |
| 872 | Marina Zeigler | female | group C | bachelor's degree | free/reduced | completed | 4.96 | 5.44 | 5.86 |
| 873 | Laurie Carter | female | group B | some high school | standard | completed | 4.24 | 4.66 | 4.72 |
| 874 | Amanda Perez | female | group A | high school | standard | completed | 5.08 | 5.80 | 5.56 |
875 rows × 9 columns
Preocupado por la dificultad que representa el graficar correctamente las notas, el rector le solicita implementar distintas alternativas de visualización.
Para esto, genere un boxplot, un displot, un histograma con un gráfico marginal de caja y un histograma con el ramo como faceta de fila que permitan visualizar las notas.
Luego, responda las siguientes pregunta:
¿Existe una diferencia notable entre las notas?
¿Cuál de los gráficos mostrados cree que es adecuado para mostrarle al rector? ¿Y a los padres? ¿Y a un centro de estudios educativos? ¿Por qué?. Base sus respuestas en lo visto en la clase de visualizaciones como también en lo que usted y su equipo consideren correcto.
Hint: Para elaborar el histograma, puede que le sea de utilidad hacer un
meltdel DataFrame, dejando como variables los ramos y valores las notas. Por otra parte, visiten la documentación para generar los gráficos.
Gráfico de Caja:
lista_scores=df_grades.filter(like="score").columns
df_scores=df_grades.filter(like="score")
df_scores=pd.melt(df_scores,value_name="score",var_name="subject")
# df_scores
df_grades_f=df_grades.filter(like="score")
# df_grades_f
caja=px.box(df_scores,y="score",color="subject")
caja
Distplot:
# use displot figurefactory
displot=ff.create_distplot(
[df_grades[c] for c in lista_scores],lista_scores,
show_rug=False,show_hist=False
)
displot.update_layout(width=600)
Histograma con Boxplots:
hist_caja=px.histogram(
df_scores,x="score",color="subject",barmode="group",
marginal="box",nbins=14,range_x=[0,8],width=600
)
hist_caja
Histograma con Faceta:
faceta = px.histogram(df_scores, x="score", color="subject",
facet_row="subject",nbins=14,width=600)
faceta
Resultados Esperados:
print("no venian acá 😔")
no venian acá 😔
Justifique:
¿Existe una diferencia notable entre las notas?
¿Cuál de los gráficos mostrados cree que es adecuado para mostrarle al rector? ¿Y a los padres? ¿Y a un centro de estudios educativos? ¿Por qué?. Base sus respuestas en lo visto en la clase de visualizaciones como también en lo que usted y su equipo consideren correcto.
Hint: Para elaborar el histograma, puede que le sea de utilidad hacer un
meltdel DataFrame, dejando como variables los ramos y valores las notas. Por otra parte, visiten la documentación para generar los gráficos.
R: Según los gráficos, las 3 notas tienen una distribución similar, tanto en desviación,centro y en su forma. Salvo la prueba de matematicas que, aparentemente, está mas centrada hacía la izquierda que las otras 2.
R: El gráfico adecuado depende del público, de los 4 gráficos realizados solo uno no permite observar correctamente las diferencias entre las notas, siendo este el gráfico de "facetas".
A los padres, dado que no podemos asumir ningún tipo de conocimiento estadistico, consideramos que el gráfico correcto es el "displot" dado que permite observar las distribuciónes sin información extra y permite observar un panorama general de la situación.
Al rector quizá le interesa saber un poco más y además se espera que tenga cierto conocimiento estadistico. Por lo que el gráfico de caja puede ser el indicado pues puede saber con más certeza donde esta la mediana y los cuartiles 3 y 1 de las ditribuciónes junto con los casos extremos que podrían ser considerados como casos criticos por ej en los puntos más alejados en los boxplots de matematicas.
Al centro de estudios, dado que su función debiera ser analizar por completo el panorama educativo y con ellos tomar desiciones, mientras más información tengan disponible es mejor para ellos, además se espera que por pertenecer a este centro cuenten con conocimientos para poder interpretar por completo un gráfico, por tanto se le asignaría el gráfico del histograma + boxplots.
El rector, basado en su experiencia, cree fuertemente que el nivel educacional y la etnia de los padres influyen en las notas que obtienen sus hijos. Como científicos de datos, ud. y su equipo creen que deben encontrar evidencia para confirmar o refutar la hipótesis del rector.
Para esto, deciden generar dos análisis: una tabla de resumen por una parte y gráficos de caja por otro.
Para generar la tabla de resumen:
GPA (grade point average).[X] Hacer una simplificación a través de un mapeo (investigar el método map()) de la variable parental level of education según la siguiente conversión:
some high school -> school
some college -> school
high school -> school
bachelor's degree -> college
associate's degree -> college
master's degree -> postgraduate
Los resultados de este mapeo deben ser guardados en la columna simple parental level of education.
race/ethnicity y simple parental level of education para obtener el promedio de las notas. race/ethnicity y simple parental level of education para obtener un conteo de los alumnos en cada grupo y agregarlos como una nueva fila count.Utilizar la tabla de resultados esperados como guía para desarrollar este punto.
#GPA, reutilizando función:
def alumnos_promedio(dataframe_in):
df = dataframe_in.copy()
scores_list = [test for test in df.columns.to_list() if 'score' in test]
df['GPA'] = np.round(df[scores_list].mean(axis=1),2)
return df
df_grades=alumnos_promedio(df_grades)
#Simplificación por "map"
education_map = {
'some high school': 'school',
'some college': 'school',
'high school': 'school',
"bachelor's degree": 'college',
"associate's degree": 'college',
"master's degree": 'postgraduate'
}
df_grades['simple parental level of education'] = df_grades['parental level of education'].map(education_map)
# Promedios por agrupación
tabla=df_grades.groupby(["race/ethnicity",'simple parental level of education']).mean().round(3)
# Conteo por agrupación
tabla['count'] = df_grades.groupby(["race/ethnicity",'simple parental level of education'])['GPA'].count()
# Porcentaje en formato pedido
alumnos=df_grades.shape[0]
tabla["percentage"]=np.round((tabla["count"]/alumnos)*100,3).apply(lambda x: '{:.2f} %'.format(x))
#tabla solicitada:
tabla
| math score | reading score | writing score | GPA | count | percentage | ||
|---|---|---|---|---|---|---|---|
| race/ethnicity | simple parental level of education | ||||||
| group A | college | 4.735 | 5.005 | 4.890 | 4.877 | 24 | 2.74 % |
| postgraduate | 4.690 | 5.230 | 5.350 | 5.090 | 2 | 0.23 % | |
| school | 4.568 | 4.726 | 4.559 | 4.618 | 51 | 5.83 % | |
| group B | college | 5.070 | 5.264 | 5.192 | 5.176 | 54 | 6.17 % |
| postgraduate | 4.912 | 5.692 | 5.548 | 5.384 | 5 | 0.57 % | |
| school | 4.689 | 4.888 | 4.764 | 4.780 | 107 | 12.23 % | |
| group C | college | 5.022 | 5.371 | 5.355 | 5.249 | 102 | 11.66 % |
| postgraduate | 4.924 | 5.144 | 5.104 | 5.057 | 15 | 1.71 % | |
| school | 4.765 | 5.024 | 4.919 | 4.903 | 155 | 17.71 % | |
| group D | college | 5.108 | 5.248 | 5.249 | 5.202 | 70 | 8.00 % |
| postgraduate | 5.218 | 5.542 | 5.734 | 5.498 | 20 | 2.29 % | |
| school | 5.019 | 5.129 | 5.110 | 5.086 | 149 | 17.03 % | |
| group E | college | 5.543 | 5.454 | 5.450 | 5.482 | 52 | 5.94 % |
| postgraduate | 5.540 | 6.030 | 5.890 | 5.820 | 6 | 0.69 % | |
| school | 5.396 | 5.311 | 5.159 | 5.289 | 63 | 7.20 % |
Resultado Esperado
| race/ethnicity | simple parental level of education | math score | reading score | writing score | GPA | count | percentage | |
|---|---|---|---|---|---|---|---|---|
| 0 | group A | college | 4.74 | 5 | 4.89 | 4.88 | 24 | 2.74 % |
| 1 | postgraduate | 4.69 | 5.23 | 5.35 | 5.09 | 2 | 0.23 % | |
| 2 | school | 4.57 | 4.73 | 4.56 | 4.62 | 51 | 5.83 % | |
| 3 | group B | college | 5.07 | 5.26 | 5.19 | 5.18 | 54 | 6.17 % |
| 4 | postgraduate | 4.91 | 5.69 | 5.55 | 5.38 | 5 | 0.57 % | |
| 5 | school | 4.69 | 4.89 | 4.76 | 4.78 | 107 | 12.23 % | |
| 6 | group C | college | 5.02 | 5.37 | 5.35 | 5.25 | 102 | 11.66 % |
| 7 | postgraduate | 4.92 | 5.14 | 5.1 | 5.06 | 15 | 1.71 % | |
| 8 | school | 4.76 | 5.02 | 4.92 | 4.9 | 155 | 17.71 % | |
| 9 | group D | college | 5.11 | 5.25 | 5.25 | 5.2 | 70 | 8.0 % |
| 10 | postgraduate | 5.22 | 5.54 | 5.73 | 5.5 | 20 | 2.29 % | |
| 11 | school | 5.02 | 5.13 | 5.11 | 5.09 | 149 | 17.03 % | |
| 12 | group E | college | 5.54 | 5.45 | 5.45 | 5.48 | 52 | 5.94 % |
| 13 | postgraduate | 5.54 | 6.03 | 5.89 | 5.82 | 6 | 0.69 % | |
| 14 | school | 5.4 | 5.31 | 5.16 | 5.29 | 63 | 7.2 % |
Ahora, implemente un gráfico de caja en donde se muestre el GPA con respecto al nivel educacional y que la variable de color sea la etnicidad y luego comente.
caja_2 = px.box(df_grades,x='simple parental level of education',y="GPA",color="race/ethnicity"
)
caja_2
El rector, basado en su experiencia, cree fuertemente que el nivel educacional y la etnia de los padres influyen en las notas que obtienen sus hijos. Como científicos de datos, ud. y su equipo creen que deben encontrar evidencia para confirmar o refutar la hipótesis del rector.
Para esto, deciden generar dos análisis: una tabla de resumen por una parte y gráficos de caja por otro.
Utilizar la tabla de resultados esperados como guía para desarrollar este punto.
Justifique:
- ¿Hay alguna diferencia entre los grupos graficados tanto para el nivel educacional de los padres como también para la etnicidad?
R: Respecto al nivel educacional de los padres, si es posible afirmar que para todos los grupos etnicos a mayor educación de los padres, mejores promedios tienen en general los hijos. En cambio, para la raza/etnia, si bien hay diferencias dentro de cada nivel educacional con respecto a los grupos, no son realmente significactivas como para decir que influyen realmente, pues hay raza/etnias que destacan en ciertos niveles educativos pero no en otros, como pasa con el Grupo D que destaca en el nivel educativo "School" pero no tanto en las otras 2.
Respecto al Grupo A si se podría decir que tiene un rendimiento por debajo de la media con respecto a los otros grupos en todos los niveles educativos de los padres, pero como es una tendencia de una de cinco razas estudiadas, no se puede concluir con respecto a ella.
Tambien para este analisís es importante considerar el número de estudiantes pertenecientes a cada raza, donde destaca nuevamente el Grupo A con menor cantidad de alumnos dentro de las 5 razas para todos los niveles educacionales de los padres. Siendo este numero tan reducido con respecto al resto, esto podría causar sesgos y errores por falta de información.
- ¿Este gráfico permite hacer facilmente un análisis conjunto de estas dos variables de forma sencilla?
R No, dado que al ser tantos grupos etnicos se hace engorrosa la comparación entre cada subgrupo del nivel educacional, para este caso es mejor observar la tabla. También ocurre que en los boxplots se oculta la información de la cantidad de sujetos por subgrupos, lo cual es imporante al momento de observar tendencias que es lo que "el rector" intenta afirmar. Por tanto, este gráfico realmente NO permite un análisis sensillo de las variables.
Mientras le notificaba por videollamada los resultados de sus descubrimientos a Don Caguayo, un exaltado practicante del area de TI entra a la reunión y les informa que ha encontrado una nueva base de datos que cuenta con las notas de dos asignaturas (en escala chilena): historia y ciencias. Para más remate, antes de huir, el practicante les cuenta que este dataframe lamentablemente contiene nuevamente los alumnos de los registros corruptos que ud. y su equipo filtraron en el análisis anterior.
El rector (evidentemente molesto por la situación) les ruega incluir estos datos (vaciados en el archivo other_grades.csv) al estudio original(students_grades.csv).
Para esto, carge el archivo other_grades.csv y busque la forma de unir ambos DataFrames, de tal manera que las columnas de history score y science score se anexen al final del DataFrame original. NO LIMPIE LOS DATOS, si no que explore los distintos tipos de merge para encontrar el mas situable para su situación (y así evitar buscar duplicados).
To-Do
other_grades.csvdf_grades con other_grades.csv usando outer join y explique el resultado.df_grades con other_grades.csv usando left join y explique el resultado.df_grades con other_grades.csv usando right join y explique el resultado.df_grades con other_grades.csv usando inner join y explique el resultado.Hint: Puede explicar los resultados del merge a través de la cantidad de filas resultantes y los valores que estas contienen.
other_grades=pd.read_csv("other_grades.csv")
other_grades.head(2)
| names | science score | history score | |
|---|---|---|---|
| 0 | Pam Otoole | 57 | 4.0 |
| 1 | Diane Olson | 48 | 4.8 |
df_grades_outer = df_grades.merge(
right=other_grades,
how="outer",
on="names"
)
df_grades_outer
| names | gender | race/ethnicity | parental level of education | lunch | test preparation course | math score | reading score | writing score | GPA | simple parental level of education | science score | history score | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Rita Courtney | female | group B | some high school | standard | none | 3.22 | 3.76 | 3.76 | 3.58 | school | 25 | 3.8 |
| 1 | Charles Linstrom | male | group A | bachelor's degree | standard | completed | 5.80 | 5.68 | 5.86 | 5.78 | college | 56 | 5.2 |
| 2 | Brian Young | male | group C | some high school | standard | none | 5.38 | 4.96 | 4.78 | 5.04 | school | 58 | 3.8 |
| 3 | Howard Jimenez | male | group E | some high school | standard | completed | 5.86 | 5.50 | 5.56 | 5.64 | school | 72 | 5.0 |
| 4 | Wayne Wilson | male | group B | some high school | standard | completed | 6.64 | 6.16 | 6.22 | 6.34 | school | 94 | 4.6 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 995 | Leona Markow | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 39 | 3.8 |
| 996 | Maxine Gulbranson | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 38 | 3.9 |
| 997 | Jeane Budds | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 43 | 3.9 |
| 998 | Nancy Ramos | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 54 | 6.2 |
| 999 | Andrea Mcdavid | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 40 | 4.2 |
1000 rows × 13 columns
df_grades_left = df_grades.merge(
right=other_grades,
how="left",
on="names"
)
df_grades_left
| names | gender | race/ethnicity | parental level of education | lunch | test preparation course | math score | reading score | writing score | GPA | simple parental level of education | science score | history score | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Rita Courtney | female | group B | some high school | standard | none | 3.22 | 3.76 | 3.76 | 3.58 | school | 25 | 3.8 |
| 1 | Charles Linstrom | male | group A | bachelor's degree | standard | completed | 5.80 | 5.68 | 5.86 | 5.78 | college | 56 | 5.2 |
| 2 | Brian Young | male | group C | some high school | standard | none | 5.38 | 4.96 | 4.78 | 5.04 | school | 58 | 3.8 |
| 3 | Howard Jimenez | male | group E | some high school | standard | completed | 5.86 | 5.50 | 5.56 | 5.64 | school | 72 | 5.0 |
| 4 | Wayne Wilson | male | group B | some high school | standard | completed | 6.64 | 6.16 | 6.22 | 6.34 | school | 94 | 4.6 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 870 | Richard Young | male | group D | high school | standard | none | 5.14 | 5.50 | 5.26 | 5.30 | school | 62 | 4.2 |
| 871 | Wanda Russell | female | group B | high school | free/reduced | completed | 2.38 | 3.64 | 3.16 | 3.06 | school | 16 | 3.6 |
| 872 | Marina Zeigler | female | group C | bachelor's degree | free/reduced | completed | 4.96 | 5.44 | 5.86 | 5.42 | college | 59 | 4.1 |
| 873 | Laurie Carter | female | group B | some high school | standard | completed | 4.24 | 4.66 | 4.72 | 4.54 | school | 43 | 4.3 |
| 874 | Amanda Perez | female | group A | high school | standard | completed | 5.08 | 5.80 | 5.56 | 5.48 | school | 61 | 5.3 |
875 rows × 13 columns
df_grades_right = df_grades.merge(
right=other_grades,
how="right",
on="names"
)
df_grades_right
| names | gender | race/ethnicity | parental level of education | lunch | test preparation course | math score | reading score | writing score | GPA | simple parental level of education | science score | history score | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Pam Otoole | female | group B | bachelor's degree | standard | none | 5.32 | 5.32 | 5.44 | 5.36 | college | 57 | 4.0 |
| 1 | Diane Olson | female | group C | some college | standard | completed | 5.14 | 6.40 | 6.28 | 5.94 | school | 48 | 4.8 |
| 2 | Sarah Flannery | female | group B | master's degree | standard | none | 6.40 | 6.70 | 6.58 | 6.56 | postgraduate | 72 | 6.1 |
| 3 | Stanley Chappell | male | group A | associate's degree | free/reduced | none | 3.82 | 4.42 | 3.64 | 3.96 | college | 47 | 3.7 |
| 4 | Arnold Dodson | male | group C | some college | standard | none | 5.56 | 5.68 | 5.50 | 5.58 | school | 60 | 5.2 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 995 | Melanie Acevedo | female | group E | master's degree | standard | completed | 6.28 | 6.94 | 6.70 | 6.64 | postgraduate | 79 | 6.3 |
| 996 | Christopher Wall | male | group C | high school | free/reduced | none | 4.72 | 4.30 | 4.30 | 4.44 | school | 62 | 4.0 |
| 997 | Margaret Spannaus | female | group C | high school | free/reduced | completed | 4.54 | 5.26 | 4.90 | 4.90 | school | 47 | 4.0 |
| 998 | Vickie Sellers | female | group D | some college | standard | completed | 5.08 | 5.68 | 5.62 | 5.46 | school | 47 | 5.7 |
| 999 | Kari Mitchell | female | group D | some college | free/reduced | none | 5.62 | 6.16 | 6.16 | 5.98 | school | 53 | 6.2 |
1000 rows × 13 columns
df_grades_right.isnull().sum()
names 0 gender 125 race/ethnicity 125 parental level of education 125 lunch 125 test preparation course 125 math score 125 reading score 125 writing score 125 GPA 125 simple parental level of education 125 science score 0 history score 0 dtype: int64
df_grades_inner = df_grades.merge(
right=other_grades,
how="inner",
on="names"
)
df_grades_inner
| names | gender | race/ethnicity | parental level of education | lunch | test preparation course | math score | reading score | writing score | GPA | simple parental level of education | science score | history score | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Rita Courtney | female | group B | some high school | standard | none | 3.22 | 3.76 | 3.76 | 3.58 | school | 25 | 3.8 |
| 1 | Charles Linstrom | male | group A | bachelor's degree | standard | completed | 5.80 | 5.68 | 5.86 | 5.78 | college | 56 | 5.2 |
| 2 | Brian Young | male | group C | some high school | standard | none | 5.38 | 4.96 | 4.78 | 5.04 | school | 58 | 3.8 |
| 3 | Howard Jimenez | male | group E | some high school | standard | completed | 5.86 | 5.50 | 5.56 | 5.64 | school | 72 | 5.0 |
| 4 | Wayne Wilson | male | group B | some high school | standard | completed | 6.64 | 6.16 | 6.22 | 6.34 | school | 94 | 4.6 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 870 | Richard Young | male | group D | high school | standard | none | 5.14 | 5.50 | 5.26 | 5.30 | school | 62 | 4.2 |
| 871 | Wanda Russell | female | group B | high school | free/reduced | completed | 2.38 | 3.64 | 3.16 | 3.06 | school | 16 | 3.6 |
| 872 | Marina Zeigler | female | group C | bachelor's degree | free/reduced | completed | 4.96 | 5.44 | 5.86 | 5.42 | college | 59 | 4.1 |
| 873 | Laurie Carter | female | group B | some high school | standard | completed | 4.24 | 4.66 | 4.72 | 4.54 | school | 43 | 4.3 |
| 874 | Amanda Perez | female | group A | high school | standard | completed | 5.08 | 5.80 | 5.56 | 5.48 | school | 61 | 5.3 |
875 rows × 13 columns
Justificación:
Se toma como referencia el df principal aquel que va a la "izquierda de la union", en este caso df_grades, y como df secunadrio o bien "aquel que va a la derecha de la union" el df "other_grades".
Outer join:
De la clase: Combina todos los elementos posibles y conserva todo el resto en filas independientes.
En este caso: Como el dataframe other_grades contiene al df principal, el resultado del join contienen a todos los alumnos que estan en other_grades y rellena con NaN los valores que no estan presentes en el principal.
Left join:
De la clase: Conserva solo los elementos que se hayan combinado correctamente provenientes dataset left.
En este caso: Deja solo los alumnos que estan contenidos en el DF principal sumando las columnas que se aportan en el DF secundario.
Right join:
De la clase: Conserva solo los elementos que se hayan combinado correctamente provenientes dataset right.
En este caso: Dado que el df de la derecha contiene al df de la izquierda, en este caso se mantiene el orden y la totalidad de las filas pero se rellenan con NaN's en los valores que no tienen informacion proveniente del df de la izquierda.
Inner join:
De la clase: Combina los elementos que se encuentren en ambas tablas. Descarta todo el resto.
En este caso: Al funcionar como " una intersección" se conservan los datos que estan en ambos df, en particular se conservan todos los datos del df principal dado que esta contenido en el secundario.
En conclusión, el mejor para este caso es el left join dado que se tiene un df principal y solo quiere agregar la información nueva y no perder la que ya se tiene.
Genere dos visualizaciones extras que encuentre interesantes (y no triviales) con estos datos y explique sus resultados. Agrupe los atributos que estime convenientes.
To-Do:
NOTA: No utilice historia ni ciencias, son notas generadas aleatoriamente.
hist_caja_extra=px.histogram(
df_grades,x="GPA",color="race/ethnicity",barmode="group",
marginal="box",nbins=14,range_x=[0,8],width=600,
title="4: Histograma + diagrama de caja según 'race/ethnicity' por 'GPA' "
)
hist_caja_extra
hist_caja_extra_2=px.histogram(
df_grades,x="GPA",color="simple parental level of education",barmode="group",
marginal="box",nbins=14,range_x=[0,8],width=600,
title="4: Histograma + diagrama de caja según 'nivel eduacional' por 'GPA' "
)
hist_caja_extra_2
Se generan 2 nuevas visualizaciones siguiendo el tipo de gráfico de la parte 1 de este lab, en los cuales se puede observar respectivamente:
La distribución del promedio de notas obtenidas por los alumnos separados por su raza/etnia, observable en un gráfico de cajas y un histograma. De este gráfico se puede decir que no hay una relación proporcional entre el promedio obtenido y su raza. Si bien se observan ciertas diferencias entre los grupos y las distribuciones, estos no son realmente significativos como para atribuirlos a un fenomeno directo.
La distribución del promedio de las notas según el nivel educacional simplificado de los padres, acompañado de un gráfico de caja. De este gráfico se observa que los hijos de padres postgraduados tienen una distribución de notas con mejores notas en general que los otros dos niveles educacionales de los padres, situacion que se repite con college respecto a school en el nivel educacional de los padres. Esto muestra cierta proporcionalidad directa entre el nivel educacional de los padres y el promedio de notas obtenidos en las pruebas por los hijos.
Si bien el analisis de estos gráficos es sobre las mismas variables trabajadas en la parte anterior, una visualización de una menor dimensionalidad y atraves de un histograma permite una mejor comprensión del problema, pues se añade de forma directa el analisis de la cantidad de elementos por grupo, lo cual queda oculto con las boxplots.
df_grades.head(2)
| names | gender | race/ethnicity | parental level of education | lunch | test preparation course | math score | reading score | writing score | GPA | simple parental level of education | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Rita Courtney | female | group B | some high school | standard | none | 3.22 | 3.76 | 3.76 | 3.58 | school |
| 1 | Charles Linstrom | male | group A | bachelor's degree | standard | completed | 5.80 | 5.68 | 5.86 | 5.78 | college |
caja_3 = px.box(df_grades,
x="gender",
y="GPA",
color="test preparation course",
title = "boxplot del GPA separado por género del impacto del test de preparacion")
caja_3
caja_3 = px.box(df_grades,
x="gender",
y="math score",
color="test preparation course",
title = "boxplot de la nota de matematica separado por género del impacto del test de preparacion")
caja_3
Se repite el ejercicio anterior, pero esta vez reutilizando el grafico tipo boxplot, donde se observa respectivamente:
Los boxplot de los promedios obtenidos por hombres y mujeres separados por si dieron o no el curso de preparación. Se observa que en ambos generos el efecto de haber rendido el curso de preparación, en promedio, mejora significativamente las notas obtenidas y en la misma proporcion, por tanto la distribución tiene valores mas altos en este caso.
En el siguiente se hace el mismo analisis pero sólo para el test de matematicas, donde se observa que la influencia entre rendir y no rendir el test de preparación tiene un impacto significativamente mayor en los hombres en comparación con las mujeres.
Eso ha sido todo para el lab de hoy, recuerden que el laboratorio tiene un plazo de entrega de una semana y tienen hasta 3 días de atraso usando sus días comodín. Cualquier duda del laboratorio, no duden en contactarnos por mail o U-cursos.